home *** CD-ROM | disk | FTP | other *** search
/ IRIX 6.2 Development Libraries / SGI IRIX 6.2 Development Libraries.iso / dist / complib.idb / usr / share / catman / p_man / cat3 / complib / psldu.z / psldu
Text File  |  1996-03-14  |  8KB  |  331 lines

  1.  
  2.  
  3.  
  4. PPPPSSSSLLLLDDDDUUUU((((3333FFFF))))                                                            PPPPSSSSLLLLDDDDUUUU((((3333FFFF))))
  5.  
  6.  
  7.  
  8. NNNNAAAAMMMMEEEE
  9.      PSLDU_Preprocess, PSLDU_Factor, PSLDU_Solve, PSLDU_Destroy,
  10.      PSLDU_Ordering - parallel sparse unsymmetric linear system solver
  11.  
  12. DDDDEEEESSSSCCCCRRRRIIIIPPPPTTTTIIIIOOOONNNN
  13.      PSLDU solves sparse unsymmetric linear systems of the form
  14.         Ax = b
  15.      where A is an n x n input matrix with symmetric non-zero pattern but
  16.      unsymmetric non-zero values, b is an input vector of length n, and x is
  17.      an unknown vector of length n.  PSLDU uses a direct method: A is factored
  18.      into the form
  19.        A = L D U
  20.      where L is a lower triangular matrix with unit diagonal, D is a diagonal
  21.      matrix and U is an upper triangular matrix with unit diagonal.
  22.  
  23.      The PSLDU library contains four main routines.  PSLDU_Preprocess()
  24.      performs preprocessing operations on the structure of A (heuristic
  25.      reordering to reduce fill in L and U, symbolic factorization, etc.).
  26.      PSLDU_Factor() factors the matrix A into L, D and U, using the previously
  27.      computed preprocessing data.  PSLDU_Solve() solves for a vector x, given
  28.      an input vector b.  PSLDU_Destroy() frees all storage associated with the
  29.      matrix A (including L, D, U, and various data structures computed during
  30.      preprocessing).  Note that the user can call PSLDU_Factor() several times
  31.      after a single call to PSLDU_Preprocess() to factor multiple matrices
  32.      with identical non-zero structures but different values.  Similarly, the
  33.      user can call PSLDU_Solve() several times after a single call to
  34.      PSLDU_Factor() to solve for multiple right-hand-sides.
  35.  
  36.      Sparse matrix A must be input to PSLDU in Harwell-Boeing format (also
  37.      known as Compressed Column Storage format).  The matrix is held in three
  38.      arrays: pointers[], indices[], and values[].  The indices[] array
  39.      contains the row indices of the non-zeros in A.  The values[] array holds
  40.      the corresponding non-zero values.  The pointers[] array contains the
  41.      index in indices[] for the first non-zero in each column of A.  Thus, the
  42.      row indices for the non-zeros in column i can be found in locations
  43.      indices[pointers[i]] through indices[pointers[i+1]-1].  The corresponding
  44.      values can be found in location values[pointers[i]] through
  45.      values[pointers[i+1]-1].
  46.  
  47.      PSLDU imposes one constraint on the representation of the A matrix.  The
  48.      non-zeros within each column must appear in order of increasing row
  49.      number.
  50.  
  51.      To give an example, the following unsymmetric matrix...
  52.  
  53.              1.0 0.0 5.0 0.0
  54.              0.0 3.0 0.0 8.0
  55.              2.0 0.0 7.0 0.0
  56.              0.0 4.0 0.0 9.0
  57.  
  58.      would be represented in FORTRAN as follows:
  59.  
  60.  
  61.  
  62.  
  63.                                                                         PPPPaaaaggggeeee 1111
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70. PPPPSSSSLLLLDDDDUUUU((((3333FFFF))))                                                            PPPPSSSSLLLLDDDDUUUU((((3333FFFF))))
  71.  
  72.  
  73.  
  74.              pointers[] = {1, 3, 5, 7, 9}
  75.              indices[] = {1, 3, 2, 4, 1, 3, 2, 4}
  76.              values[] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0}
  77.  
  78.      Zero-based indexing is used in C, so the pointers[] and indices[] arrays
  79.      would instead contain:
  80.  
  81.              pointers[] = {0, 2, 4, 6, 8}
  82.              indices[] = {0, 2, 1, 3, 0, 2, 1, 3}
  83.  
  84.      The routine PSLDLU_Ordering allows the user to change the ordering method
  85.      used to pre-order the matrix before factorization.  This routine must be
  86.      called before calling PSLDLT_Preprocess.  Three options are currently
  87.      available: method 0 performs no pre-ordering, method 1 (the default)
  88.      performs Approximate Minimum Degree ordering, and method 2 performs
  89.      multi-level nested dissection ordering.  Method 2 is significantly more
  90.      expensive than method 1, but it often produces significantly better
  91.      orderings.
  92.  
  93.      The environment variable MPC_NUM_THREADS determines the number of
  94.      processors that are used for the numerical factorization.  Setting the
  95.      environment variable PSLDU_VERBOSE causes PSLDU to output information
  96.      about the factorization.
  97.  
  98.  
  99. FFFFOOOORRRRTTTTRRRRAAAANNNN SSSSYYYYNNNNOOOOPPPPSSSSIIIISSSS
  100.      SUBROUTINE PSLDU_PREPROCESS (TOKEN, N, POINTERS, INDICES, NONZ, OPS)
  101.  
  102.          INTEGER TOKEN, N
  103.  
  104.          INTEGER POINTERS( * ), INDICES( *)
  105.  
  106.          INTEGER NONZ,
  107.  
  108.          DOUBLE PRECISION OPS
  109.  
  110.  
  111.      SUBROUTINE PSLDU_FACTOR (TOKEN, N, POINTERS, INDICES, VALUES)
  112.  
  113.          INTEGER TOKEN, N
  114.  
  115.          INTEGER POINTERS( * ), INDICES( * )
  116.  
  117.          DOUBLE PRECISION VALUES( * )
  118.  
  119.  
  120.      SUBROUTINE PSLDU_SOLVE (TOKEN, X, B)
  121.  
  122.          INTEGER TOKEN
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129.                                                                         PPPPaaaaggggeeee 2222
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136. PPPPSSSSLLLLDDDDUUUU((((3333FFFF))))                                                            PPPPSSSSLLLLDDDDUUUU((((3333FFFF))))
  137.  
  138.  
  139.  
  140.          DOUBLE PRECISION X( * ), B( * )
  141.  
  142.  
  143.      SUBROUTINE PSLDU_DESTROY (TOKEN)
  144.  
  145.          INTEGER TOKEN
  146.  
  147.      SUBROUTINE PSLDU_ORDERING (TOKEN, METHOD)
  148.  
  149.          INTEGER TOKEN
  150.  
  151.          INTEGER METHOD
  152.  
  153. CCCC SSSSYYYYNNNNOOOOPPPPSSSSIIIISSSS
  154.      void PSLDU_Preprocess (
  155.  
  156.          int token,
  157.  
  158.          int n,
  159.  
  160.          int pointers[],
  161.  
  162.          int indices[],
  163.  
  164.          int *nonz,
  165.  
  166.          double *ops
  167.  
  168.          );
  169.  
  170.      void PSLDU_Factor (
  171.  
  172.          int token,
  173.  
  174.          int n,
  175.  
  176.          int pointers[],
  177.  
  178.          int indices[],
  179.  
  180.          double values[]
  181.  
  182.          );
  183.  
  184.      void PSLDU_Solve (
  185.  
  186.          int token,
  187.  
  188.          double x[],
  189.  
  190.  
  191.  
  192.  
  193.  
  194.  
  195.                                                                         PPPPaaaaggggeeee 3333
  196.  
  197.  
  198.  
  199.  
  200.  
  201.  
  202. PPPPSSSSLLLLDDDDUUUU((((3333FFFF))))                                                            PPPPSSSSLLLLDDDDUUUU((((3333FFFF))))
  203.  
  204.  
  205.  
  206.          double b[]
  207.  
  208.          );
  209.  
  210.      void PSLDU_Destroy (
  211.  
  212.          int token
  213.  
  214.          );
  215.  
  216.      void PSLDU_Ordering (
  217.  
  218.          int token,
  219.  
  220.          int method
  221.  
  222.          );
  223.  
  224.  
  225. AAAARRRRGGGGUUUUMMMMEEEENNNNTTTTSSSS
  226.      token (input)
  227.              PSLDU can handle multiple matrices simultaneously.  The token
  228.              distinguishes between active matrices.  The token passed to
  229.              PSLDU_Factor() must match the token used in some previous call to
  230.              PSLDU_Preprocess().  Similarly, the token passed to PSLDU_Solve()
  231.              must match the token used in some previous call to
  232.              PSLDU_Factor().
  233.  
  234.      n (input)
  235.              The number of rows and columns in the matrix A.  n >= 0.
  236.  
  237.      pointers, indices, values (input)
  238.              The pointers and indices arrays store the non-zero structure of
  239.              sparse input matrix A in Harwell-Boeing or Compressed Sparse
  240.              Column (CSC) format.  The pointers array stores n+1 integers,
  241.              where pointers[i] gives the index in indices of the first non-
  242.              zero in column i of A.  The indices array stores the row indices
  243.              of the non-zeros in A.  The nz array stores the non-zero values
  244.              in the matrix A.
  245.  
  246.      nonz, ops (output)
  247.              The number of non-zero values in L and D, and the number of
  248.              floating-point operations required to factor A.
  249.  
  250.      b (input)
  251.              The right-hand-side vector in a PSLDU_Solve call.
  252.  
  253.      x (output)
  254.              The solution vector in a PSLDU_Solve call.
  255.  
  256.  
  257.  
  258.  
  259.  
  260.  
  261.                                                                         PPPPaaaaggggeeee 4444
  262.  
  263.  
  264.  
  265.  
  266.  
  267.  
  268. PPPPSSSSLLLLDDDDUUUU((((3333FFFF))))                                                            PPPPSSSSLLLLDDDDUUUU((((3333FFFF))))
  269.  
  270.  
  271.  
  272. TTTTUUUUNNNNIIIINNNNGGGG
  273.      Optimized and parallelized for the SGI R8000 platform.
  274.  
  275.  
  276.  
  277.  
  278.  
  279.  
  280.  
  281.  
  282.  
  283.  
  284.  
  285.  
  286.  
  287.  
  288.  
  289.  
  290.  
  291.  
  292.  
  293.  
  294.  
  295.  
  296.  
  297.  
  298.  
  299.  
  300.  
  301.  
  302.  
  303.  
  304.  
  305.  
  306.  
  307.  
  308.  
  309.  
  310.  
  311.  
  312.  
  313.  
  314.  
  315.  
  316.  
  317.  
  318.  
  319.  
  320.  
  321.  
  322.  
  323.  
  324.  
  325.  
  326.  
  327.                                                                         PPPPaaaaggggeeee 5555
  328.  
  329.  
  330.  
  331.